﻿using System;
using DevExpress.XtraEditors;
using System.Windows.Forms;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using System.IO;
using System.Data.SqlClient;

namespace MikroTransfer
{
    public partial class frmKontorFaturaAktarim : XtraForm
    {
        Dictionary<string, Stok> stokkodlari = new Dictionary<string, Stok>();
        Mikro mikro = new Mikro(Db.Kontur);

        public frmKontorFaturaAktarim()
        {
            InitializeComponent();
        }

        private void frmKontorFaturaAktarim_Load(object sender, EventArgs e)
        {
            if (File.Exists(Application.StartupPath + "\\kontor_urun_eslestirme.txt"))
            {
                using (StreamReader sr = new StreamReader(Application.StartupPath + "\\kontor_urun_eslestirme.txt"))
                {
                    string[] alanlar = null;

                    while (sr.Peek() > -1)
                    {
                        alanlar = sr.ReadLine().Split(';');
                        if (!stokkodlari.ContainsKey(alanlar[0]))
                        {
                            decimal[] dizi = mikro.StokKdvBilgileri(alanlar[1]);
                            stokkodlari.Add(alanlar[0], new Stok()
                            {
                                Kod = alanlar[1],
                                KdvSira = Cevir.Parse<int>(dizi[0]),
                                KdvOran = Cevir.Parse<int>(dizi[1]),
                                Otv = dizi[2]
                            });
                        }
                    }
                    sr.Close();
                }
            }
        }

        private void MikroKaydet(List<HamVeri> data)
        {
            var sonuc = (from b in data group b by new { b.CariKod, b.Tarih, b.CariUnvani } into g orderby g.Key.CariKod, g.Key.Tarih select new { g.Key.CariKod, g.Key.Tarih, g.Key.CariUnvani }).ToList();
            progressBarControl1.Properties.Minimum = 0;
            progressBarControl1.Properties.Maximum = sonuc.Count;

            string kasaKodu = Program.Session[Settings.WebNakitKasaKodu].ToString();
            string evrakSeri = txtSeri.Text;
            int evrakSira;
            int evrakSatir;
            int vergi_sira;
            int CharId;
            decimal tutar;
            decimal fiyat = 0;
            decimal kdvTutari = 0;
            decimal meblag = 0;
            decimal otvTutari = 0;
            int depoNo = Cevir.Parse<int>(Program.Session[Settings.WebDepoKodu]);
            Dictionary<int, int> kdvlist = mikro.KdvList();
            decimal[] vergiTutarlari = new decimal[10];

            DbSqlServer _dbsql = new DbSqlServer();

            SqlTransaction trn = _dbsql.OpenTransaction();

            foreach (var item in sonuc)
            {
                mikro.AddtoTeminci(item.CariKod, item.CariUnvani, "", "", "", "", "", trn);
                evrakSira = mikro.MaxEvrakNo(EvrakTipleri.SatisFaturasi, evrakSeri, trn);
                evrakSatir = 0;
                vergiTutarlari = new decimal[10];
                tutar = 0;
                meblag = 0;
                otvTutari = 0;
                var kayitlar = (from b in data where b.CariKod == item.CariKod && b.Tarih == item.Tarih group b by new { b.CariKod, b.Tarih, b.StokKod } into g select new { g.Key.StokKod, Toplam = g.Sum(x => x.Miktar) }).ToList();

                foreach (var h in kayitlar)
                {
                    if (stokkodlari.ContainsKey(h.StokKod))
                    {
                        Stok stk = stokkodlari[h.StokKod];
                        fiyat = mikro.SatisFiyat(stk.Kod, item.CariKod, depoNo, trn);

                        if (kdvlist.ContainsKey(stk.KdvOran))
                            vergi_sira = kdvlist[stk.KdvOran];
                        else
                            vergi_sira = 0;

                        tutar += ((h.Toplam * fiyat) / ((100m + stk.KdvOran) / 100m));
                        kdvTutari = ((h.Toplam * fiyat) - ((h.Toplam * fiyat) / ((100m + stk.KdvOran) / 100m)));
                        meblag += h.Toplam * fiyat;
                        vergiTutarlari[vergi_sira] += kdvTutari;

                        otvTutari += h.Toplam * stk.Otv;
                    }
                }

                CharId = mikro.CharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, item.Tarih, meblag + otvTutari, vergiTutarlari, "", item.CariKod, tutar, "", 0, "", 0, 0, 0, 0, item.CariKod, Program.Session[Settings.WebSrmMerkezKodu].ToString(), otvTutari);

                if (CharId > -1)
                {
                    foreach (var h in kayitlar)
                    {
                        if (stokkodlari.ContainsKey(h.StokKod))
                        {
                            Stok stk = stokkodlari[h.StokKod];
                            fiyat = mikro.SatisFiyat(stk.Kod, item.CariKod, depoNo, trn);
                            kdvTutari = ((h.Toplam * fiyat) - ((h.Toplam * fiyat) / ((100m + stk.KdvOran) / 100m)));
                            tutar = ((h.Toplam * fiyat) / ((100m + stk.KdvOran) / 100m));

                            mikro.SharEkle(EvrakTipleri.SatisFaturasi, trn, evrakSeri, evrakSira, item.Tarih, evrakSatir, stk.Kod, item.CariKod, "", h.Toplam, tutar, stk.KdvSira, kdvTutari, CharId, depoNo, depoNo, 0, 0, 0, Program.Session[Settings.WebSrmMerkezKodu].ToString(), 0);
                        }
                        evrakSatir++;
                    }
                }

                progressBarControl1.Position += 1;
                progressBarControl1.Refresh();
            }

            try
            {
                trn.Commit();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                if (trn != null)
                {
                    trn.Rollback();
                    if (trn.Connection != null)
                    {
                        trn.Connection.Close();
                    }
                }
            }
        }


        private List<HamVeri> HamData()
        {

            List<HamVeri> list = new List<HamVeri>();
            Dictionary<string, string> anacari = mikro.AnaCarikodlari();
            string cariKod = "";
            string cariUnvani = "";

            for (int i = 1; i < c1FlexGrid1.Rows.Count; i++)
            {
                HamVeri veri = new HamVeri();
                veri.Tarih = Cevir.Parse<DateTime>(c1FlexGrid1[i, 0]);
                cariUnvani = c1FlexGrid1[i, 1].ToString();
                cariKod = c1FlexGrid1[i, 2].ToString().Substring(c1FlexGrid1[i, 2].ToString().IndexOf(',') + 1);

                if (anacari.ContainsKey(cariKod))
                {
                    string satir = anacari[cariKod];
                    cariKod = satir.Split(';')[0];
                    cariUnvani = satir.Split(';')[1];
                }

                veri.CariUnvani = cariUnvani;
                veri.CariKod = cariKod;
                veri.StokKod = c1FlexGrid1[i, 4].ToString().Trim();
                veri.Miktar = Cevir.Parse<int>(c1FlexGrid1[i, 5]);
                list.Add(veri);
            }
            return list;
        }

        private void txtDosyaAdi_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            OpenFileDialog dlg = new OpenFileDialog();
            dlg.FileName = string.Empty;
            if (dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                txtDosyaAdi.Text = dlg.FileName;
                c1FlexGrid1.LoadExcel(dlg.FileName);
            }
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(txtDosyaAdi.Text) && c1FlexGrid1.Rows.Count > 0)
            {
                MikroKaydet(HamData());
            }
            else
            {
                MessageBox.Show("Lütfen Web'den yüklediğiniz excel dosyasını seçin !");
            }
        }
    }
}
